/**
 *
 * @author paco
 */
public class TipoArray extends Tipo
{
	/**
	 * Dimensión del array.
	 */
	private Integer size;
	/**
	 * Comrpueba si se ha inicializado el vector (new).
	 */
	private boolean inicializado;

	/**
	 * Constructor.
	 * @param nombre Nombre del array.
	 * @param tipoBase Tipo base del array ( tipoBase nombre[] )
	 * @param size Número de dimensiones del array
	 */
	public TipoArray(Tipo tipoBase, Integer size)
	{
		super("Array", tipoBase);
		this.size = size;
		this.inicializado = false;
	}
	
	@Override
	public Tipo getTipoSimple()
	{
		if ( this.getTipoBase() != null )
		{
			return this.getTipoBase().getTipoSimple();
		}
		return this;
	}
	
	/**
	 * Obtiene una cadena que representa el tipo base del vector.
	 * @return Tipo base.
	 */
	public String getTipoSimpleString()
	{
		return getTipoSimple().toString();
	}
	
	public int getTotalSize()
	{
		TipoArray t = this;
		int size = 1;
		while ( t!= null && t.isArray())
		{
			size *= t.getSize();
			if ( !t.getTipoBase().isArray())
			{
				break;
			}
			t = (TipoArray) t.getTipoBase();
		}
		return size;
	}
	/**
	 * Obtiene el tamaño de un vector hasta un indice.
	 * @param indice Indice.
	 * @return  Tamaño.
	 */
	public int getParcialSize(int indice)
	{
		TipoArray t = this;
		int size = 1;
		while ( t != null && t.isArray() && indice > 0)
		{
			size *= t.getSize();
			if ( t.getTipoBase().isArray())
			{
				t = (TipoArray) t.getTipoBase();
			}
			else
			{
				t = null;
			}
			indice--;
		}
		return getTotalSize() / size;
	}

	public Integer getSize()
	{
		return size;
	}

	public void setSize(Integer size)
	{
		this.size = size;
	}
	
	public void setSize(String size)
	{
		this.size = Integer.parseInt(size);
	}

	public boolean isInicializado()
	{
		return inicializado;
	}

	public void setInicializado()
	{
		this.inicializado = true;
	}
	
	/**
	 * Obtiene las dimensiones de un vector.
	 * @return Dimensiones.
	 */
	public int getDimensiones()
	{
		Tipo t = this;
		int dims = 0;
		while ( t.getTipoBase() != null )
		{
			t = t.getTipoBase();
			dims++;
		}
		return dims;
	}
	
	@Override
	public String toWrite()
	{
		StringBuilder sb = new StringBuilder();
		
		sb.append(this.getTipoSimple().toWrite()).append("[]");
		
		return sb.toString();
	}
	
	/**
	 * Obtiene la traducción de un array.
	 * @return Traducción del array.
	 */
	@Override
	public String toString()
	{
		return this.getTipoBase() == null ? "" : this.getTipoBase().toString();
	}
}
